package controller;

/**
 *
 * @author greg
 */
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.InputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import java.util.List;
import java.util.Iterator;
import java.util.ResourceBundle;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;
import model.bean.BeanArchivo;
import model.bean.BeanCategoria;
import model.bean.BeanCurso;
import model.bean.BeanSemestre;
import model.bean.BeanUsuario;
import model.dao.DaoArchivo;
import model.dao.DaoCategoria;
import model.dao.DaoCurso;
import model.dao.DaoSemestre;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;

@WebServlet(name = "ServletUpload", urlPatterns = {"/ServletUpload"})
public class ServletUpload extends HttpServlet {

    private String dirUploadFiles; //directorio donde se guardara los archivos
    private String maxFileSize;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        ResourceBundle bundle = ResourceBundle.getBundle("configs/config");
        //dirUploadFiles = bundle.getString("Ubicacion");
        dirUploadFiles=request.getServletContext().getRealPath("descarga/");
        maxFileSize = bundle.getString("tamanho");
        String idcurso = null;
        String idsemestre = null;
        String idcategoria = null;
        String nombre = null;
        String md5 = null;
        String nombre_producido = null;
        String destino="";
        String md5_name="";
        String mensaje_error = "";


        if (ServletFileUpload.isMultipartContent(request)) {

            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(new Long(maxFileSize).longValue()); // 1024 x 300 = 307200 bytes = 300 Kb
            //upload.setSizeMax( new Long( getServletContext().getInitParameter( "maxFileSize" ) ).longValue() ); // 1024 x 300 = 307200 bytes = 300 Kb

            List listUploadFiles = null;
            FileItem item = null;
            Iterator it = null;

            try {
                listUploadFiles = upload.parseRequest(request);

                it = listUploadFiles.iterator();
                while (it.hasNext()) {
                    item = (FileItem) it.next();
                    if (!item.isFormField()) {
                        if (item.getSize() > 0) {
                            nombre = item.getName();
                            String tipo = item.getContentType();
                            long tamanio = item.getSize();
                            String extension = nombre.substring(nombre.lastIndexOf("."));
                            Date date = new Date();
                            md5_name = nombre + tamanio + date;

                            File archivo = new File(dirUploadFiles, md5(md5_name)+".pdf");

                            if (extension.equals(".pdf")) {

                                item.write(archivo);

                                if (archivo.exists()) {
                                    destino="/view/user/index.jsp";
                                } else {
                                }
                            } else {
                                
                                destino="/view/user/archivo/subir.jsp?error=1";
                            }
                        }
                    } else {
                        if (item.getFieldName().compareTo("idcurso") == 0) {
                            idcurso = item.getString();
                        } else if (item.getFieldName().compareTo("idsemestre") == 0) {
                            idsemestre = item.getString();
                        } else if (item.getFieldName().compareTo("idcategoria") == 0) {
                            idcategoria = item.getString();
                        }



                    }
                }

            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            

            BeanArchivo filex = new BeanArchivo();
            HttpSession session = request.getSession();
            DaoSemestre daosemestre = new DaoSemestre();
            DaoCurso daocurso = new DaoCurso();
            DaoCategoria daocategoria = new DaoCategoria();

            filex.setNombre(daocurso.obtenerNombre(idcurso) + "_" + daosemestre.obtenerNombre(idsemestre) + "_" + daocategoria.obtenerNombre(idcategoria));

            filex.setCurso(new BeanCurso());
            filex.getCurso().setIdcurso(Integer.parseInt(idcurso));

            filex.setUsuario(new BeanUsuario());
            BeanUsuario user = (BeanUsuario) session.getAttribute("usuario");
            filex.getUsuario().setIdusuario(user.getIdusuario());

            filex.setCategoria(new BeanCategoria());
            filex.getCategoria().setIdcategoria(Integer.parseInt(idcategoria));



            Calendar c = Calendar.getInstance();

            String dia = Integer.toString(c.get(Calendar.DATE));
            String mes = Integer.toString(c.get(Calendar.MONTH));
            String annio = Integer.toString(c.get(Calendar.YEAR));
            String hora = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
            String minuto = Integer.toString(c.get(Calendar.MINUTE));
            String segundo = Integer.toString(c.get(Calendar.SECOND));
            
            String fecha_sql = annio+"-" +mes+"-"+dia+ " " + hora + ":" + minuto + ":" + segundo;


            filex.setFecha_subida(fecha_sql);

            filex.setSemestre(new BeanSemestre());
            filex.getSemestre().setIdsemestre(Integer.parseInt(idsemestre));

            filex.setNombre_md5(md5(md5_name));

            DaoArchivo daoarchivo = new DaoArchivo();
            daoarchivo.subir_archivo(filex);
            
            

            

        }
        
        RequestDispatcher rd = getServletContext().getRequestDispatcher(destino);
            rd.forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    public static String hex(byte[] array) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1, 3));
        }
        return sb.toString();
    }

    public static String md5(String message) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return hex(md.digest(message.getBytes("CP1252")));
        } catch (NoSuchAlgorithmException e) {
        } catch (UnsupportedEncodingException e) {
        }
        return null;
    }
}
